const multer = require('multer');
const path = require('path');
const fs = require('fs');

// 配置存储选项
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, 'uploads/');
  },
  filename: (req, file, cb) => {
    // 生成唯一的文件名，避免重复
    const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
    const ext = path.extname(file.originalname);
    const baseName = path.basename(file.originalname, ext);
    cb(null, baseName + '-' + uniqueSuffix + ext);
  }
});

// 文件过滤，只允许上传图片
const fileFilter = (req, file, cb) => {
  const allowedMimes = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif'];
  if (allowedMimes.includes(file.mimetype)) {
    cb(null, true);
  } else {
    cb(new Error('不支持的文件类型。只允许上传JPEG、JPG、PNG和GIF格式的图片。'), false);
  }
};

// 创建上传中间件
const upload = multer({
  storage,
  limits: {
    fileSize: 5 * 1024 * 1024, // 限制文件大小为5MB
  },
  fileFilter
});

// Multer错误处理中间件
const handleMulterError = (err, req, res, next) => {
  if (err instanceof multer.MulterError) {
    console.error('Multer错误:', err);
    let errorMessage = '文件上传错误';
    
    switch (err.code) {
      case 'LIMIT_FILE_SIZE':
        errorMessage = '文件大小超过限制(5MB)';
        break;
      case 'LIMIT_FILE_COUNT':
        errorMessage = '文件数量超过限制';
        break;
      case 'LIMIT_UNEXPECTED_FILE':
        errorMessage = `不支持的文件字段名: ${err.field}`;
        break;
      default:
        errorMessage = err.message || '文件上传错误';
    }
    
    return res.status(200).json({
      errCode: 4003,
      errMsg: errorMessage
    });
  }
  next(err);
};

// 通用文件上传接口 - 支持任意字段名的单文件或多文件上传
exports.uploadImages = [
  upload.any(), // 接受任意字段名的文件
  handleMulterError,
  async (req, res) => {
    try {
      if (!req.files || req.files.length === 0) {
        return res.status(200).json({
          errCode: 4002,
          errMsg: '没有文件被上传'
        });
      }

      // 处理上传的文件
      const images = req.files.map(file => ({
        filename: file.filename,
        fieldname: file.fieldname,
        path: file.path,
        url: `/uploads/${file.filename}`,
        size: file.size,
        mimetype: file.mimetype
      }));

      // 根据文件数量返回不同格式的响应
      if (images.length === 1) {
        // 单文件上传响应格式
        res.json({
          errCode: 0,
          errMsg: '上传成功',
          data: {
            filename: images[0].filename,
            fieldname: images[0].fieldname,
            path: images[0].path,
            url: images[0].url,
            size: images[0].size,
            mimetype: images[0].mimetype
          }
        });
      } else {
        // 多文件上传响应格式
        res.json({
          errCode: 0,
          errMsg: '上传成功',
          data: {
            count: images.length,
            images
          }
        });
      }
    } catch (error) {
      console.error('上传图片错误:', error);
      res.status(500).json({
        errCode: 500,
        errMsg: error.message || '上传失败'
      });
    }
  }
];

// 为了保持向后兼容性，保留原有的接口但指向新的处理函数
exports.uploadSingleImage = exports.uploadImages;
exports.uploadMultipleImages = exports.uploadImages;

// 删除图片接口
exports.deleteImage = async (req, res) => {
  try {
    const { filename } = req.body;
    if (!filename) {
      return res.status(200).json({
        errCode: 40005,
        errMsg: '缺少文件名参数'
      });
    }

    const imagePath = path.join(__dirname, '..', 'uploads', filename);
    
    // 检查文件是否存在
    if (!fs.existsSync(imagePath)) {
      return res.status(200).json({
        errCode: 4004,
        errMsg: '图片不存在'
      });
    }

    // 删除文件
    fs.unlinkSync(imagePath);

    res.json({
      errCode: 0,
      errMsg: '图片删除成功'
    });
  } catch (error) {
    console.error('删除图片错误:', error);
    res.status(500).json({
      errCode: 500,
      errMsg: error.message || '删除失败'
    });
  }
};